package br.com.processo.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.util.MessageFactory;

import br.com.processo.modelo.Parecer;
import br.com.processo.modelo.Processo;
import br.com.processo.modelo.Setor;
import br.com.processo.modelo.Usuario;
import br.com.processo.servico.ProcessoService;
import br.com.processo.servico.SetorService;
import br.com.processo.util.Constantes;

@Named
@SessionScoped
public class ProcessoBean implements Serializable {

	private static final long serialVersionUID = 9189305912380797107L;

	@Inject
	private ProcessoService serviceProcesso;

	@Inject
	private SetorService serviceSetor;

	private Processo processo;
	private Usuario usuarioLogado;

	private List<Processo> processos;
	private List<Setor> tiposSetores;

	private Parecer parecerProcesso;

	public ProcessoBean() {
	}

	public String paginaCriarProcesso() {
		usuarioLogado = (Usuario) getFromSession(Constantes.USUARIO_LOGADO);
		this.processo = new Processo(usuarioLogado);
		return Constantes.CD_PROCESSO + Constantes.REDIRECT_TRUE;
	}

	public String paginaEditarProcesso() {
		if (this.processo == null) {
			addMessage("growlProcessos", FacesMessage.SEVERITY_WARN,
					"nenhum_processo_selecionado");
			return "";
		}
		this.processo.setAtualizacao(true);
		return Constantes.CD_PROCESSO + Constantes.REDIRECT_TRUE;
	}

	public void inicializaParecer() {
		this.setParecerProcesso(new Parecer());
	}

	public void salvarParecer() {
		if(this.processo == null) {
			addMessage("growlProcessos", FacesMessage.SEVERITY_WARN,
					"nenhum_processo_selecionado");
			return;
		}
		try {
			if (this.processo.getPareceres() == null) {
				this.processo.setPareceres(new ArrayList<Parecer>());
			}
			this.parecerProcesso.setAutor(this.usuarioLogado);
			this.processo.getPareceres().add(parecerProcesso);
			serviceProcesso.salvarProcesso(this.processo);
			
			this.parecerProcesso = null;
			this.processo = null;
			atualizaProcessos();
			
			addMessage("growlProcessos", FacesMessage.SEVERITY_INFO,
					"sucesso_salvar_parecer");

		} catch (Exception e) {
			e.printStackTrace();
			addMessage("growlProcessos", FacesMessage.SEVERITY_ERROR,
					"problema_salvar_parecer");
		}
	}

	public String paginaListarProcessos() {
		usuarioLogado = (Usuario) getFromSession(Constantes.USUARIO_LOGADO);
		this.parecerProcesso = new Parecer();
		atualizarSetores();
		atualizaProcessos();
		return Constantes.LISTAR_PROCESSOS + Constantes.REDIRECT_TRUE;
	}

	private void atualizaProcessos() {
		if (usuarioLogado.getAdministrador()) {
			this.processos = serviceProcesso.listarProcessos();

		} else {
			this.processos = serviceProcesso
					.listarProcessosPorSetor(this.usuarioLogado.getSetor()
							.getId());
		}
	}

	private void atualizarSetores() {
		List<Setor> tiposSetoresCompleto = this.serviceSetor.getTiposSetores();
		if(tiposSetoresCompleto.contains(usuarioLogado.getSetor())) {
			tiposSetoresCompleto.remove(usuarioLogado.getSetor());
		}
		this.setTiposSetores(tiposSetoresCompleto);
	}

	public void handleFileUpload(FileUploadEvent event) {
		FacesMessage msg = new FacesMessage("Succesful", event.getFile()
				.getFileName() + " is uploaded.");
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void salvarProcesso() {
		try {
			serviceProcesso.salvarProcesso(this.processo);
			this.processo = new Processo();
			addMessage("growlProcesso", FacesMessage.SEVERITY_INFO,
					"sucesso_salvar_processo");
		} catch (Exception e) {
			e.printStackTrace();
			addMessage("growlProcesso", FacesMessage.SEVERITY_ERROR,
					"problema_salvar_processo");
		}
	}

	public void deletarProcesso() {
		if (this.processo == null) {
			addMessage("growlProcessos", FacesMessage.SEVERITY_WARN,
					"nenhum_processo_selecionado");
			return;
		}

		try {
			serviceProcesso.deletarProcesso(this.processo);
			this.processos = serviceProcesso.listarProcessos();
			this.processo = null;
			addMessage("growlProcessos", FacesMessage.SEVERITY_INFO,
					"processo_deletado_sucesso");
		} catch (Exception e) {
			e.printStackTrace();
			addMessage("growlProcessos", FacesMessage.SEVERITY_ERROR,
					"erro_deletar_processo");
		}

	}

	public void addMessage(String componente, FacesMessage.Severity tipo,
			String nomeMensagem) {
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.addMessage(componente,
				MessageFactory.getMessage(nomeMensagem, tipo, new String[] {}));
	}

	public Object getFromSession(String key) {
		Map<String, Object> sessionMap = FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap();
		return sessionMap.get(key);
	}

	public Processo getProcesso() {
		return processo;
	}

	public void setProcesso(Processo processo) {
		this.processo = processo;
	}

	public List<Processo> getProcessos() {
		return processos;
	}

	public void setProcessos(List<Processo> processos) {
		this.processos = processos;
	}

	public Usuario getUsuarioLogado() {
		return usuarioLogado;
	}

	public void setUsuarioLogado(Usuario usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}

	public List<Setor> getTiposSetores() {
		return tiposSetores;
	}

	public void setTiposSetores(List<Setor> tiposSetores) {
		this.tiposSetores = tiposSetores;
	}

	public Parecer getParecerProcesso() {
		return parecerProcesso;
	}

	public void setParecerProcesso(Parecer parecerProcesso) {
		this.parecerProcesso = parecerProcesso;
	}

}
